package net.luohuasheng.bee.proxy.core.utils.jpa;


import net.luohuasheng.bee.proxy.core.utils.ColumnUtils;
import net.luohuasheng.bee.proxy.core.utils.ExpireMap;
import net.luohuasheng.bee.proxy.core.utils.StringUtils;
import net.luohuasheng.bee.proxy.core.utils.classloader.ClassLoaderUtils;
import net.luohuasheng.bee.proxy.core.utils.classloader.dto.ClassMethodDto;
import net.luohuasheng.bee.proxy.core.utils.jpa.annotation.TableExtra;
import net.luohuasheng.bee.proxy.core.utils.jpa.dto.JpaColumnDto;
import net.luohuasheng.bee.proxy.core.utils.jpa.dto.JpaTableDto;

import javax.persistence.Table;

/**
 * @author luohuasheng
 * @date 2020/4/21 10:57
 */
public class JpaModelUtils {
    private static final ExpireMap<Class<?>, JpaTableDto> CLASS_CACHE = new ExpireMap<>(3600 * 1000, 1000);
    private static final String SELECT = "select";

    public static JpaTableDto getJpaTable(Class<?> classZ) {
        return CLASS_CACHE.computeIfAbsent(classZ, v -> loadJpaTable(classZ));
    }

    private static JpaTableDto loadJpaTable(Class<?> classZ) {

        Table table = classZ.getAnnotation(Table.class);
        TableExtra tableExtra = classZ.getAnnotation(TableExtra.class);
        JpaTableDto tableDto = new JpaTableDto();
        if (table != null) {
            tableDto.setName(table.name());
            if (table.name().toLowerCase().contains(SELECT)) {
                tableDto.setTable(false);
                tableDto.setName("(" + table.name() + ") entity");

            }
        }
        if (tableExtra != null) {
            tableDto.setComment(tableExtra.comment());
        }
        if (StringUtils.isEmpty(tableDto.getName())) {
            tableDto.setName(ColumnUtils.toSnakeCase(classZ.getSimpleName()));
        }
        for (ClassMethodDto<JpaColumnDto> value : ClassLoaderUtils.getClassMethod(classZ, JpaLoadUtils::loadJpaColumn).values()) {
            if (value.getColumn() != null) {
                tableDto.getColumns().add(value.getColumn());
            }
        }
        return tableDto;
    }


}
